#? 类的定义
from http.client import MOVED_PERMANENTLY
from unicodedata import name


class Person():
    #? 对象的特征 -- 变量
    #* P_name = 'User'
    #* P_sex = 'Man'
    #* P_age = 25
    #* P_height = 175
    #? 对象属性的限制绑定
    __slots__ = ('P_name','P_sex','P_age','P_height')
    #? 对象的行为 -- 函数
    def run(self):
        print("running~")

    def eat(self,sthing):
        print(f"eating:{sthing}")

    def show(self):
        print(f"{self.P_name,self.P_age,self.P_sex,self.P_height}")
        #print(f"{self.name,self.age,self.sex}")

#? 类成员的访问
'''
(1) 类和函数相似，会引入新的作用域，所以在类中定义的函数在类的外面无法直接调用
(2) 类中的行为主要由对象来执行，所以类中的函数需要通过对象调用；先创建对象，再访问
(3) self  自己，自身，在面向对象中，表示当前对象，不需要手动传参
(4) 在Python中 self 不是关键字,Java中才是
'''
#! 测试代码
#>> o_person = Person()
#>> o_person.run()
#>> o_person.eat('面条')
#? 属性: 类中定义的变量
'''
对象属性的动态绑定
(1) 给一个对象动态绑定的属性，另一个对象未绑定的情况下无法访问
(2) 不同的对象绑定了一个重名的属性，当一个对象的属性发生改变时，对另一个对象的属性没有影响
'''
t_person = Person()
t_person.P_name= "new_User"
t_person.P_age = 24
t_person.P_sex = 'Man'
t_person.P_height = 175
t_person.show()

'''
对象属性的动态限制绑定
__slots__ = ('P_name','P_sex','P_age','P_height')
系统属性，__lots__ 绑定我们所需的属性字段名称，这个地方需要一个元组
#! 注意元组书写元素的时候，需要一个逗号 __slots__ = ("P_name',)
'''


#TODO 需求：王老师让[小明，小花，小丽] 做自我介绍

class Teacher():
    __slots__ = ("T_name",)

    #? stu_name 需要传递的是对象
    def P_task(self,stu):
        print(f"{self.T_name}让{stu.S_name}做自我介绍~~")
    
        #? 学生执行自己的行为
        stu.S_intro()
        if stu.S_name =="晓明":
            stu.sing()
        elif stu.S_name =="小李":
            stu.dance()
        elif stu.S_name =="小南":
            stu.draw()
class Student():
    __slots__ = ("S_name","S_age","S_hobby")

    def S_intro(self):
        print(f"大家好,我是{self.S_name}，今年{self.S_age}岁,爱好是{self.S_hobby}")

    def sing(self):
        print("今天我给大家带来一首许嵩的《留香》,希望大家喜欢😍")

    def dance(self):
        print("我给大家跳一个机械舞,让我们一起嗨起来")

    def draw(self):
        print("我现场给一位同学做临摹素描")

#? 创建老师对象
T_wang = Teacher()
T_wang.T_name = "王老师"

#? 创建学生对象
#* 学生晓明
ming = Student()
ming.S_name = "晓明"
ming.S_age = 24
ming.S_hobby = "唱歌"

#* 学生李
li = Student()
li.S_name = "小李"
li.S_age = 22
li.S_hobby = "跳舞"

#*学生南
nan = Student()
nan.S_name = "小南"
nan.S_age = 23
nan.S_hobby = "画画"

#>> 老师调用任务
T_wang.P_task(ming)
print()
T_wang.P_task(li)
print()
T_wang.P_task(nan)

'''
猫类的属性有昵称name,年龄age, 方法有抓老鼠

   鼠类的属性有昵称name

   创建猫的对象，信息为5岁的tom猫

   创建老鼠的对象，信息为名为jerry  

   执行猫抓老鼠的行为

   输出示例：一只5岁的tom猫抓到一只名叫jerry的老鼠

'''
class Cat():
    __slots__ = ("name","age")
    def __init__(self,name,age) -> None:
        self.name = name
        self.age = age
    
    def catch_mouse(self,mouse):
        print(f"一只{self.age}岁的{self.name}抓住了一只名叫{mouse.name}的老鼠")

class Mouse():
    __slots__ = ("name",)
    def __init__(self,name) -> None:
        self.name = name

tom = Cat("Tom",5)
jerry = Mouse("jerry")
tom.catch_mouse(jerry)

